package com.flying.iter;

import com.google.inject.spi.LinkedKeyBinding;
import org.junit.jupiter.api.Test;

import java.util.*;

/**
 * @ClassName IteratorTest
 * @Author flying
 * @Date 2025/1/27 9:18
 * @Description 迭代器的使用
 *
 *
 * Collection接口继承了Iterable接口，在该接口中包含一个名为iterator的抽象方法，
 * 所有实现了Collection接口的容器类对该方法做了具体实现。
 * iterator方法会返回一个Iterator接口类型的迭代器对象，在该对象中包含了三个方法用于实现对单例容器的迭代处
 * boolean hasNext(); //判断游标当前位置的下一个位置是否还有元素没有被遍历；
 * Object next(); //返回游标当前位置的下一个元素并将游标移动到下一个位置；
 * void remove(); //删除游标当前位置的元素，在执行完next后该操作只能执行一次；
 *
 */
public class IteratorTest {

    /**
     * 迭代器遍历List集合
     */
    @Test
    void test1(){

        List<String> list=new ArrayList<>();

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");


        System.out.println("===================while循环==================");

        // 获取迭代器
        Iterator<String> iterator = list.iterator();

        // 方式1： while 循环
        while(iterator.hasNext()){
            // next()方法的作用： ① 指针下移 ② 将下移以后集合位置上的元素返回
            String next = iterator.next();
            System.out.println("next = " + next);
        }


        System.out.println("===================for循环==================");

        for (Iterator<String> iterator1=list.iterator();iterator1.hasNext();){
            String next = iterator1.next();
            System.out.println("next = " + next);
        }






    }


    /**
     * 迭代器遍历 Set集合
     */
    @Test
    void test2(){

        Set<String> set=new HashSet<>();

        set.add("a");
        set.add("faf");
        set.add("g");
        set.add("d");


        Iterator<String> iterator = set.iterator();
        System.out.println("===================while循环==================");

        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println("next = " + next);
        }



        System.out.println("===================for循环==================");

        for (Iterator<String> iterator1=set.iterator();iterator1.hasNext();){
            String next = iterator1.next();
            System.out.println("next = " + next);
        }




    }

    /**
     * 迭代器遍历map双例集合
     */
    @Test
    void test3(){

        Map<String,Integer> map=new HashMap<>();

        map.put("flying",45);
        map.put("lucy",12);
        map.put("tom",65);
        map.put("carry",43);
        map.put("sandy",22);


        // Map集合无法直接遍历
        // 1. 遍历 key集合
        // 2. 遍历 Map.Entry集合


        Set<String> keySet = map.keySet();
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();

        Iterator<String> iterator = keySet.iterator();
        Iterator<Map.Entry<String, Integer>> iterator1 = entrySet.iterator();



        System.out.println("===================while循环==================");

        while(iterator.hasNext()){
            String key_while = iterator.next();
            System.out.println("key_while = " + key_while);
        }

        while (iterator1.hasNext()){
            Map.Entry<String, Integer> entry = iterator1.next();
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"==="+value);
        }



        System.out.println("===================for循环==================");

        for (Iterator<String> iterator2=keySet.iterator();iterator2.hasNext();){
            String key_for = iterator2.next();
            System.out.println("key_for = " + key_for);
        }

        for (Iterator<Map.Entry<String,Integer>> iterator2=entrySet.iterator();iterator2.hasNext();){
            Map.Entry<String, Integer> entry = iterator2.next();
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"==="+value);

        }


    }


    /**
     * 在迭代器中删除元素
     */
    @Test
    void test4(){


        List<String> list=new ArrayList<>();

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");


        // 注意：普通for循环和增强for循环都不支持边迭代，边删除

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()){
            String next = iterator.next();

            // 删除操作必须在 next()方法后
            iterator.remove();

        }

        for (String s : list) {
            System.out.println("s = " + s);
        }
    }





}
